package hobby.wei.c.persist;

import java.util.Collections;
import java.util.HashSet;
import java.util.Set;

import hobby.wei.c.framework.AbsApp;

import static hobby.wei.c.utils.Assist.requireNotEmpty;
import static hobby.wei.c.utils.Assist.requireNotEquals;

public class XxxKeeper extends Keeper.Wrapper {
    private static final String KEEPER_XML = "xxx";
    private static final String KEEPER_META = "xxx-meta";
    private static final String KEY_META = "meta";

    /**
     * 取得与参数指定的module关联的本对象。
     * <p>
     * 注意：虽然本对象里的方法可以在任何module被调用，但是请确保仅调用与参数module相关的方法，
     * 否则会造成混乱。因此，不建议将方法写在本类里面。
     * <p>
     * 不过也有在不同module下写同一个flag的需求，反正自己应该理清楚需求和存储关系。
     *
     * @param userId
     * @param module
     * @param clear  在特定情况下（退出之后或登录之前）是否清除该数据。
     * @return
     */
    static XxxKeeper get(String userId, String module, boolean clear) {
        requireNotEmpty(userId);
        requireNotEmpty(module);
        if (clear) module += "_c";
        ensureModule2Meta(userId, module, clear);
        return getModule(userId, module).bind(new XxxKeeper());
    }

    private static Keeper.Builder getModule(String userId, String module) {
        return get(AbsApp.get().getApplicationContext(), KEEPER_XML + "-" + module)
                .withUser(userId)
                .multiProcess();
    }

    private static void ensureModule2Meta(String userId, String module, boolean clear) {
        final Keeper meta = getMeta(userId);
        final Set<String> set = meta.getSharedPreferences().getStringSet(KEY_META,
                new HashSet<String>()/*后面有add()操作*/);
        if (!set.contains(module)) {
            set.add(module);
            meta.edit().putStringSet(KEY_META, set).apply();
        }
        if (clear) {
            meta.keepBoolean(requireNotEquals(module, KEY_META), true);
        }
    }

    private static Keeper getMeta(String userId) {
        return get(AbsApp.get().getApplicationContext(), KEEPER_META)
                .withUser(userId)
                .multiProcess()
                .ok();
    }

    static void clear(String userId) {
        final Keeper meta = getMeta(userId);
        final Set<String> set = meta.getSharedPreferences().getStringSet(KEY_META, Collections.<String>emptySet());
        boolean b = false;
        for (String module : new HashSet<>(set)) {
            if (meta.contains(module)) {
                if (!b) b = true;
                getModule(userId, module).ok().edit().clear().apply();
                set.remove(module);
            }
        }
        if (b) meta.edit().putStringSet(KEY_META, set).apply();
    }

    /////////////////////////////////////////////////////////////////
    //******************** 以下为自定义keys和函数 ********************//
}
